home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / develop / symcoff.arc / SYMCOFF.C < prev    next >
C/C++ Source or Header  |  1989-05-11  |  5KB  |  238 lines

  1. #ifndef PCPORT
  2. #define PCPORT
  3. #endif
  4.  
  5. #include <dos.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <ctype.h>
  10.  
  11. #include "pcport.h"
  12. #include "par.h"
  13. #include "pfilehdr.h"
  14. #include "pldfcn.h"
  15.  
  16. #include "paouthdr.h"
  17. #include "pscnhdr.h"
  18. #include "psyms.h"
  19. #include "pstrclss.h"
  20.  
  21. #include "pldf_dcl.h"
  22.  
  23.  
  24. /*
  25. #define FILE struct _iobuf
  26. extern  FILE {
  27.     char *_ptr;
  28.     int   _cnt;
  29.     char *_base;
  30.     char  _flag;
  31.     char  _file;
  32.     } _NEAR _CDECL _iob[];
  33. */
  34.  
  35. short    cds8 = 0;
  36.  
  37. extern int     pldaclose(register LDFILE *);
  38. extern LDFILE *pcldopen (char *, LDFILE *);
  39. int            do_symbol(SYMENT *, char *);
  40. extern char   *basenam    (char *);
  41. int        gensym(char *);
  42.  
  43. short
  44. main(argc,argv)
  45. short argc;
  46. char *argv[ ];
  47. {
  48.     char *    s;
  49.     char    nami[_MAX_FNAME];
  50.  
  51.     while (--argc > 0 &&(*++argv)[0] == '-')
  52.     {
  53.         for (s = argv[0]+1; *s != '\0'; ++s)
  54.         {
  55.             switch (*s)
  56.             {
  57.             case 'c':
  58.                 cds8 = 1;
  59.                 break;
  60.             default:
  61.                 printf("illegal option %c\n", *s);
  62.                 argc = -1;
  63.                 break;
  64.             }
  65.         }
  66.     }
  67.     if (argc < 0)
  68.     {
  69.         printf("Usage: symcoff [-c] [files ...]\n");
  70.         exit(-1);
  71.     }
  72.     else if (argc == 0)
  73.     {
  74.         while ((gets(nami))!=NULL)
  75.         {
  76.             if (nami[0]=='\0')
  77.             {
  78.                 /*
  79.                 ** skip empty input line
  80.                 */
  81.                 continue;
  82.             }
  83.             gensym(nami);
  84.         }
  85.         printf("All files processed\n");
  86.     }
  87.     else
  88.     {
  89.         while ((argc--) > 0)
  90.         {
  91.             gensym(*argv);
  92.             argv++;
  93.         }
  94.     }
  95.     return(0);
  96. }
  97.  
  98.  
  99. int
  100. gensym(nami)
  101. char *nami;
  102. {
  103.     FILE    *fip, *fop;
  104.     LDFILE    *ldptr = 0L;
  105.     SYMENT     symbuf;
  106.     AUXENT     auxbuf;
  107.     char     outbuf[100];
  108.     char     namo[_MAX_FNAME];
  109.     int     i,j;
  110.  
  111.  
  112.     /* Open one input COFF and output file*/
  113.  
  114.     ldptr = (LDFILE *)0L;
  115.     if ((ldptr=pcldopen(nami,ldptr))==NULL)  return(FAILURE);
  116.     fip = IOPTR(ldptr);
  117.  
  118.     strcpy(namo,nami);
  119.     for (i=strlen(namo)-1; i>0 && namo[i] != '\.'; i--);
  120.     if (i>0) namo[i] = '\0';
  121.     fop = fopen(strcat(namo,"\.sym"),"wb");
  122.     /*fread(&HEADER(nldptr), FILHSZ, 1, IOPTR(ldptr));*/
  123.  
  124.     /* Seek to beginning of symbol table */
  125.  
  126.     if(HEADER(ldptr).f_symptr == 0L)  return(FAILURE);
  127.     if(fseek(IOPTR(ldptr),(long)(OFFSET(ldptr)+HEADER(ldptr).f_symptr),0)
  128.          != 0)    return(FAILURE);
  129.  
  130.     /* Retrieve symbols, skip aux records */
  131.  
  132.     for (i=0; i<HEADER(ldptr).f_nsyms; i++) {
  133.         fread(&symbuf, SYMESZ, 1, IOPTR(ldptr));
  134.         for (j=0; j < (int)symbuf.n_numaux; j++, i++)    /*i++ ??*/
  135.         fread(&auxbuf, AUXESZ, 1, IOPTR(ldptr));
  136.         if (do_symbol(&symbuf, outbuf))
  137.         fputs(outbuf,fop);
  138.     }
  139.  
  140.     fclose(fip);
  141.     fclose(fop);
  142.  
  143.     return(SUCCESS);
  144. }
  145.  
  146. LDFILE  *pcldopen(filename, ldptr)
  147. char   *filename;
  148. LDFILE *ldptr;
  149. {
  150.    char            line[sizeof(ARMAG)];
  151.    register long   disp;
  152.    long            ftell();
  153.    struct ar_hdr   ar_head;
  154.    register LDFILE *nldptr;
  155.  
  156.    if(ldptr==0) {
  157.        if((nldptr=(LDFILE *) pldallocptr()) == FAILURE)        return(NULL);
  158.        if((IOPTR(nldptr) = fopen(filename, "rb")) == NULL)     return(NULL);
  159.        if(fread(line, sizeof(ARMAG), 1, IOPTR(nldptr)) != 1)   return(NULL);
  160.        if(strnicmp(line, ARMAG, sizeof(ARMAG) - 1) != 0) {
  161.           /* non-archive format, regular coff */
  162.           fseek(IOPTR(nldptr), 0L, 0);
  163.           OFFSET(nldptr) = 0L;
  164.           TYPE(nldptr) = 1;
  165.        }
  166.        else {
  167.           /* archive format */
  168.           TYPE(nldptr) = PLDARMAG;
  169.           OFFSET(nldptr) = sizeof(ARMAG) + sizeof(struct ar_hdr) - 1;
  170.           disp = _fpldahread(nldptr) + OFFSET(nldptr) + sizeof(struct ar_hdr);
  171.           fseek(IOPTR(nldptr), disp, 0);
  172.           OFFSET(nldptr) = ftell(IOPTR(nldptr));
  173.        }
  174.        fread(&HEADER(nldptr), FILHSZ, 1, IOPTR(nldptr));
  175.        return(nldptr);
  176.    }
  177.    else {  /*(ldptr != 0)*/
  178.        if(fread(&HEADER(ldptr), FILHSZ, 1, IOPTR(ldptr)) != 1)   return(NULL);
  179.        return(ldptr);
  180.    }
  181. }
  182.  
  183.  
  184. int
  185. do_symbol(symptr, outbuf)
  186. SYMENT *symptr;
  187. char    outbuf[];
  188. {
  189.     short i;
  190.     char c;
  191.  
  192.  
  193.     /* filter: .bf .ef etc */
  194.     /* relocate n_value using sec. number and other info */
  195.     /* returns 0 if do not output */
  196.  
  197.     if (cds8)
  198.     {
  199.         if (!iscsymf(symptr->n_name[0]))
  200.         {
  201.             return(0);
  202.         }
  203.         for (i = 1; i < 8; ++i)
  204.         {
  205.             if ((c = symptr->n_name[i]) == '\0')
  206.             {
  207.                 break;
  208.             }
  209.             if (!iscsym(c))
  210.             {
  211.                 return(0);
  212.             }
  213.         }
  214.         sprintf(outbuf, "define %8.8s %#.4lx\n\0",
  215.                 symptr->n_name, symptr->n_value);
  216.  
  217.     }
  218.     else
  219.     {
  220.         sprintf(outbuf, " @LS %s %#.8lX\n\0",
  221.                 symptr->n_name, symptr->n_value);
  222.         printf( " @LS %s %#.8lX \(%hd\) aux:%hd\n",
  223.                 symptr->n_name, symptr->n_value,
  224.                 symptr->n_scnum, (short)symptr->n_numaux);
  225.     }
  226.     return(1);
  227. }
  228.  
  229.  
  230. char * basenam(fullnam)
  231. char * fullnam;
  232. {
  233.     char *p;
  234.     p = fullnam + strlen(fullnam);
  235.     while (*(p-1)!='\\' && p>fullnam) p--;
  236.     return (p);
  237. }
  238.